// 14.自定义数据.go
// 演示 GORM 框架中自定义数据类型的使用
// 本文件展示了两种不同的JSON数据序列化方式的实际应用示例：
// 1. 自定义实现接口的方式
// 2. GORM内置序列化器的方式
package main

import (
	"fmt"              // 格式化包，用于输出信息
	"gin-gorm/global"  // 全局配置包，提供数据库连接等功能
	"gin-gorm/models"  // 模型定义包，包含UserZdy等模型定义
)

// UserZdy 函数演示自定义数据类型的CRUD操作
// 该函数包含多个操作示例，展示了如何使用两种不同的JSON序列化方式
func UserZdy() {
	// 示例1: 使用自定义实现接口的方式创建数据
	// 通过UserInfo结构体的自定义序列化方法将数据保存到数据库
	// err := global.DB.Create(&models.UserZdy{
	//	Name: "枫枫",
	//	Info: models.UserInfo{
	//		Likes: []string{"唱", "跳", "rap"},
	//	},
	// }).Error
	// fmt.Println(err) // 打印可能的错误信息

	// 示例2: 使用自定义实现接口的方式查询数据
	// 查询数据库并自动通过Scan方法将JSON数据反序列化为结构体
	// var user models.UserZdy
	// global.DB.Take(&user) // 获取第一条记录
	// fmt.Println(user, user.Info.Likes) // 打印用户信息和兴趣爱好

	// 示例3: 同时使用两种序列化方式创建数据
	// 同时保存自定义序列化(Info)和GORM内置序列化(Card)的数据
	// err := global.DB.Create(&models.UserZdy{
	//	Name: "小李",
	//	Info: models.UserInfo{
	//		Likes: []string{"唱", "跳", "rap"},
	//	},
	//	Card: models.Card{
	//		Cars: []string{"法拉利", "布加迪"},
	//	},
	// }).Error

	// fmt.Println(err) // 打印可能的错误信息

	// 示例4: 使用GORM内置序列化器查询数据
	// 查询最后一条记录并自动处理两种不同的JSON序列化字段
	var user models.UserZdy
	global.DB.Last(&user) // 获取最后一条记录
	// 打印完整用户信息和Card字段中的第二个车辆信息
	fmt.Println(user, user.Card.Cars[1])

}

// main 函数是程序的入口点
// 负责初始化数据库连接并调用演示函数
func main() {
	// 连接数据库
	// 调用global包中的Connect函数建立数据库连接
	global.Connect()
	
	// 迁移数据库表结构（当前被注释掉）
	// global.Migrate()会根据模型定义自动创建或更新数据库表
	// global.Migrate()
	
	// 调用演示函数执行自定义数据类型的操作
	UserZdy()
}
